import {ReactNode} from "react";
import {ButtonProps} from "antd/lib/button";
import {CheckboxProps} from "antd/lib/checkbox";
import {CheckboxChangeEvent} from "antd/lib/checkbox/Checkbox";

/**
 * 字典值类型枚举
 */
export enum DicValueType {
  string = 1,
  number,
}

/** 树节点模型 */
export interface TreeNodeModel {
  /** 主键 */
  id: string;
  /** 上级主键 */
  parentId: string;
  /** 标识 */
  key: string;
  /** 标题 */
  title: string | ReactNode;
  /** 默认根据此属性值进行筛选（其值在整个树范围内唯一） */
  value: any;
  /** 设置节点是否可被选中 */
  selectable: boolean;
  /** 当树为 checkable 时，设置独立节点是否展示 Checkbox */
  checkable: boolean;
  /** 禁掉 checkbox */
  disableCheckbox: boolean;
  /** 禁掉响应 */
  disabled: boolean;
  /** 自定义图标。可接收组件，props 为当前节点 props */
  icon: ReactNode | ((props: any) => ReactNode);
  /** 设置为叶子节点(设置了loadData时有效) */
  isLeaf: boolean;
  /** 子级 */
  children: TreeNodeModel[];
  /** 序号 */
  path: string | number;
}

export interface DndNodeModel {
  /** 主键 */
  id: string;
  /** 上级主键 */
  parentId: string;
  /** 序号 */
  index: string | number;
}

/** 服务接口响应结果 */
export interface ApiResult<P = {}> {
  /** 状态码,0表示操作没有任何错误 */
  code: number;
  /** 操作是否成功 */
  success: boolean;
  /** 操作消息 */
  msg?: string;
  /** 响应数据 */
  data: P;
}

/** 对话框组件方法 */
export interface ModalMethods {
  /** 显示对话框 */
  show: (args: any) => void;
  /** 隐藏对话框 */
  hide: () => void;
}

/** 编辑组件属性 */
export interface EditComponentProps {
  /** 是否新建 */
  created: boolean;
  /** 新对象 */
  newModel?: any;
  /** 编辑主键 */
  id?: string;
  /** 是否可见 */
  visible: boolean;
  /** 其他参数 */
  args?: any;
}

/** 对话框组件 */
export interface DialogOperate {
  /** 对话框是否可见 */
  visible: boolean;
  /** 参数对象 */
  params: { [key: string]: any };
  /** 设置对话框可见状态 */
  setVisible: (_visible: boolean, params?: any) => void;
  /** 显示对话框 */
  show: (params?: any) => void;
  /** 隐藏对话框 */
  hide: () => void;
  /** 隐藏对话框并执行回调函数 */
  hideCallback: (callback?: () => void) => void;
}

/** 编辑对话框组件属性 */
export interface EditDialogProps extends DialogOperate {
}

/** 详情对话框组件属性 */
export interface DetailsDialogProps extends DialogOperate {
}

/** 详情组件返回值 */
export interface DetailsOperateResult<T> {
  /** 表示数据读取操作是否正在进行中 */
  loading: boolean,
  /** 详情数据对象 */
  model?: T | undefined;
}

/** 编辑对话框尾部控件属性 */
export interface EditModalFooterProps {
  /** 是否显示确认按钮 */
  okVisible?: boolean;
  /** 确认按钮显示在前面 */
  okFirst?: boolean;
  /** 确认按钮 loading */
  okLoading?: boolean;
  /** 确认按钮文字 */
  okText?: string | ReactNode;
  /** 确认按钮类型 */
  okType?: string;
  /** 确认按钮属性 */
  okProps?: ButtonProps;
  /** 点击确定回调 */
  onOk?: () => void;

  /** 取消按钮文字 */
  cancelText?: string | ReactNode;
  /** 取消按钮属性 */
  cancelProps?: ButtonProps;
  /** 是否显示取消按钮 */
  cancelVisible?: boolean;
  /** 点击遮罩层或右上角叉或取消按钮的回调 */
  onCancel?: () => void;

  /** 是否显示连续保存复选框 */
  continueSaveVisible?: boolean;
  /** 连续保存复选框文字 */
  continueSaveText?: string | ReactNode;
  /** 连续保存复选框属性 */
  continueSaveProps?: CheckboxProps;
  /** 是否选中连续保存复选框 */
  continueSaveChecked?: boolean;
  /** 连续保存复选框Change事件 */
  onContinueSaveChange?: (e: CheckboxChangeEvent) => void;

  /** 是否显示重置表单复选框 */
  resetFormVisible?: boolean;
  /** 重置表单复选框文字 */
  resetFormText?: string | ReactNode;
  /** 重置表单复选框属性 */
  resetFormProps?: CheckboxProps;
  /** 是否选中重置表单复选框 */
  resetFormChecked?: boolean;
  /** 重置表单复选框Change事件 */
  onResetFormChange?: (e: CheckboxChangeEvent) => void;

  /** 自定义右边的按钮集合 */
  buttons?: ReactNode[];
}
